import axios from 'axios'
import { ElMessage } from 'element-plus'

// 获取CSRF令牌的函数
function getCookie(name: string): string | null {
  const cookieValue = document.cookie
    .split('; ') 
    .find(row => row.startsWith(name + '=')) 
    ?.split('=')[1];
  return cookieValue ? decodeURIComponent(cookieValue) : null;
}

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '',
  timeout: 300000, // 5分钟超时
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  },
  withCredentials: true,
  maxRedirects: 5,
  validateStatus: function (status) {
    return status >= 200 && status < 300; // 默认行为
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const csrfToken = getCookie('XSRF-TOKEN') || getCookie('csrftoken');
    if (csrfToken) {
      config.headers['X-CSRFToken'] = csrfToken;
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器 - 合并重试机制和错误处理
let responseInterceptorAdded = false;

if (!responseInterceptorAdded) {
  service.interceptors.response.use(
    response => {
      return response
    },
    error => {
      const config = error.config;
      
      // 实现重试机制
      if (config && config.retry) {
        config.__retryCount = config.__retryCount || 0;
        
        // 检查是否已经达到了最大重试次数
        if (config.__retryCount < config.retry) {
          // 检查是否满足重试条件
          if (!config.retryCondition || config.retryCondition(error)) {
            // 增加重试计数
            config.__retryCount += 1;
            
            // 创建一个新的Promise来处理重试延迟，对于AI请求使用更长的延迟
            const backoff = new Promise((resolve) => {
              // 对于AI相关的请求使用更长的延迟时间
              const delay = config.url?.includes('/ai/') ? 5000 : config.retryDelay || 1000;
              setTimeout(() => {
                console.log(`请求重试 ${config.__retryCount}/${config.retry}，URL: ${config.url}，延迟: ${delay}ms`);
                resolve(undefined);
              }, delay);
            });
            
            // 返回一个新的请求
            return backoff.then(() => {
              // 复制配置对象，避免修改原始配置
              const retryConfig = { ...config };
              
              // 移除之前的X-CSRFToken，让请求拦截器重新生成
              if (retryConfig.headers) {
                delete retryConfig.headers['X-CSRFToken'];
              }
              
              // 重新发送请求
              return service(retryConfig);
            });
          }
        }
      }
      
      // 常规错误处理 - 直接显示错误提示，不打印控制台日志
      if (error.response) {
        switch (error.response.status) {
          case 401:
            ElMessage.error('未授权，请重新登录')
            break
          case 403:
            ElMessage.error('拒绝访问')
            break
          case 404:
            ElMessage.error('请求地址不存在')
            break
          case 500:
            ElMessage.error('服务器内部错误')
            break
          default:
            ElMessage.error(`请求失败：${error.response.data.message || '未知错误'}`)
        }
      } else if (error.request) {
        ElMessage.error('网络错误，请检查网络连接')
      } else if (error.code === 'ECONNABORTED') {
        ElMessage.error('请求超时，请稍后重试')
      } else {
        ElMessage.error(`请求配置错误：${error.message}`)
      }
      return Promise.reject(error)
    }
  );
  
  responseInterceptorAdded = true;
}

export default service